#include "bsp_rgb.h"

static uint8_t writeBuf[12];   // 驱动输出的缓冲区

/*
	RGB控制驱动（TM1814）
	0 码或 1 码周期在 1.25μs 范围内，芯片均可正常工作，但是 0 码和 1 码低电平时间必须符合上表中相应数值范围；
	不需复位时，字节之间的高电平时间不要超过 126μs，否则芯片可能复位，复位后又重新接收数据，无法实现数
据正常传送。
*/

// 约730ns
static void RGB_Delay(void)
{
	uint8_t i;
	for(i=0;i<5;i++) 
	{
		__NOP;
	}
}

// Լ390ns
static void RGB_DelayHalf(void){
	__NOP;
}


void RGB_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
	
  RCC_APB2PeriphClockCmd(RGB_RCC, ENABLE);	    
	GPIO_InitStructure.GPIO_Pin = RGB_PIN;              
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;           
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(RGB_PORT, &GPIO_InitStructure); 
	
	RGB_DATA_H;
	
	
		
	// LED 电流等级设置成最大38mA
	rgb.c1[0] = 0x3F;
	rgb.c1[1] = 0x3F;
	rgb.c1[2] = 0x3F;
	rgb.c1[3] = 0x3F;
	rgb.c2[0] = ~rgb.c1[0];
	rgb.c2[1] = ~rgb.c1[1];
	rgb.c2[2] = ~rgb.c1[2];
	rgb.c2[3] = ~rgb.c1[3];
	
	//rgb.red = 150;
}



void RGB_WriteBit(uint8_t b)
{
	if(b==0)
	{
		RGB_DATA_L;
		RGB_DelayHalf();
		RGB_DATA_H;
		RGB_Delay();
	}
	else{
		RGB_DATA_L;
		RGB_Delay();
		RGB_DATA_H;
		RGB_DelayHalf();
	}
}

/*******************************************************
	复位芯片数据接收，只需要高电平持续时间超过 126μs
********************************************************/
static void RGB_Reset(void)
{
	RGB_DATA_H;
	
	// 约128us
	for(uint8_t i=0;i<210;i++)
		RGB_Delay();
}

/*******************************************************
	写一个字节
********************************************************/
static void RGB_WriteByte(uint8_t data)
{
	int8_t i=0;
	for(i=7;i>=0;i--)
	{
		RGB_WriteBit((data>>i)&0x01);
	}
}

/*******************************************************
	设置颜色
c1;四字节长度，每个字节范围0~63，设置w、r、g、b输出的电流强度
c2:四字节长度，为c1的按位取反
w:0~255
r:0~255
g:0~255
b:0~255
********************************************************/
void RGB_SetColorWithI(uint8_t *c1,uint8_t *c2,uint8_t w,uint8_t r,uint8_t g,uint8_t b)
{
	memcpy(rgb.c1, c1, 4);
	memcpy(rgb.c2, c2, 4);
	rgb.w = w;
	rgb.red = r;
	rgb.green = g;
	rgb.blue = b;
}

/*******************************************************
	设置颜色
w:0~255
r:0~255
g:0~255
b:0~255
********************************************************/
void RGB_SetColor(uint8_t w,uint8_t r,uint8_t g,uint8_t b)
{
	rgb.w = w;
	rgb.red = r;
	rgb.green = g;
	rgb.blue = b;
}



/*******************************************************
周期执行，根据boardDev中的参数决定是否需要输出数据，如果
对比前后两次不一样则输出
********************************************************/
void RGB_Updata(void)
{
		memcpy(writeBuf, rgb.c1, 4);
		memcpy(writeBuf+4, rgb.c2, 4);
		writeBuf[8] = rgb.w;
		writeBuf[9] = rgb.red;
		writeBuf[10] = rgb.blue;
		writeBuf[11] = rgb.green;
		for(uint8_t i=0;i<sizeof(writeBuf);i++)
			RGB_WriteByte(writeBuf[i]);
		RGB_Reset();
}

